/**
 * 文件工具类 - 提供文件上传、下载和处理相关功能
 */
import api from '@/api/apiClient';

/**
 * 文件相关工具函数
 */
const fileUtil = {
  /**
   * 将File对象预览为Data URL
   * @param {File} file - 文件对象
   * @returns {Promise<string>} Data URL字符串
   */
  previewFile(file) {
    return new Promise((resolve, reject) => {
      if (!file) {
        reject(new Error('没有选择文件'));
        return;
      }
      
      const reader = new FileReader();
      reader.onload = (e) => resolve(e.target.result);
      reader.onerror = (e) => reject(e);
      reader.readAsDataURL(file);
    });
  },
  
  /**
   * 验证图片文件（类型和大小）
   * @param {File} file - 图片文件
   * @param {number} maxSize - 最大大小（字节）
   * @returns {Object} 验证结果 {valid: boolean, message: string}
   */
  validateImageFile(file, maxSize = 2 * 1024 * 1024) {
    if (!file) {
      return { valid: false, message: '请选择文件' };
    }
    
    // 检查文件类型
    if (!file.type.startsWith('image/')) {
      return { valid: false, message: '只支持上传图片文件' };
    }
    
    // 检查文件大小
    if (file.size > maxSize) {
      return { 
        valid: false, 
        message: `图片大小不能超过${Math.round(maxSize/1024/1024)}MB` 
      };
    }
    
    return { valid: true, message: '验证通过' };
  },
  
  /**
   * 上传用户头像
   * @param {File} file - 头像文件
   * @returns {Promise<Object>} 上传结果
   */
  async uploadAvatar(file) {
    try {
      // 验证文件
      const validation = this.validateImageFile(file);
      if (!validation.valid) {
        return { success: false, message: validation.message };
      }
      
      // 上传文件
      const response = await api.user.uploadAvatar(file);
      console.log('头像上传响应:', response);
      
      // 处理响应
      if ((response && response.code === 200) || 
          (response && response.message === '头像上传成功')) {
        return { 
          success: true, 
          message: '头像上传成功',
          data: response.data || {}
        };
      }
      
      // 处理错误
      const errorMsg = response?.message || '头像上传失败';
      return { 
        success: false, 
        message: errorMsg 
      };
    } catch (error) {
      console.error('上传头像失败:', error);
      return { 
        success: false, 
        message: error.message || '头像上传失败'
      };
    }
  },
  
  /**
   * 获取用户头像
   * @returns {Promise<Object>} 处理后的头像数据 {success, message, imageUrl}
   */
  async downloadAvatar() {
    try {
      const response = await api.user.downloadAvatar();
      console.log('头像下载响应:', response);
      
      if (!response) {
        return { success: false, message: '未收到头像响应' };
      }

      // 处理服务器返回的错误（如用户未设置头像）
      if (response.code === 500 && response.message === '用户未设置头像') {
        console.log('用户未设置头像，使用默认头像');
        return { success: false, message: '用户未设置头像', noAvatar: true };
      }
      
      // 解析头像数据
      let avatarData = null;
      
      // 标准API响应格式 {code, message, data}
      if (response.code === 200 && response.data) {
        avatarData = response.data;
      } 
      // 直接返回的是数据 {avatar, avatarType}
      else if (response.avatar && response.avatarType) {
        avatarData = response;
      }
      
      // 验证头像数据
      if (!avatarData || !avatarData.avatar || !avatarData.avatarType) {
        return { success: false, message: '头像数据不完整' };
      }
      
      // 生成头像URL
      let imageUrl = null;
      
      if (typeof avatarData.avatar === 'string') {
        // Base64字符串
        imageUrl = `data:${avatarData.avatarType};base64,${avatarData.avatar}`;
      } else if (Array.isArray(avatarData.avatar)) {
        // 字节数组
        const blob = new Blob(
          [new Uint8Array(avatarData.avatar)], 
          { type: avatarData.avatarType }
        );
        imageUrl = URL.createObjectURL(blob);
      } else {
        return { 
          success: false, 
          message: `不支持的头像数据类型: ${typeof avatarData.avatar}` 
        };
      }
      
      return { 
        success: true, 
        message: '头像获取成功', 
        imageUrl: imageUrl,
        avatarType: avatarData.avatarType
      };
    } catch (error) {
      // 如果错误信息包含"用户未设置头像"，这是一个预期的错误
      if (error.message && error.message.includes('用户未设置头像')) {
        console.log('用户未设置头像，返回特殊标记');
        return { success: false, message: '用户未设置头像', noAvatar: true };
      }
      
      console.error('获取头像失败:', error);
      return { 
        success: false, 
        message: error.message || '获取头像失败' 
      };
    }
  }
};

export default fileUtil;
